package cn.com.filemanager;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.FileUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

/**
 * @author zhaokk
 * @since 2024/7/20
 */
@MultipartConfig
@WebServlet("/upload")
public class UploadServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1.创建DiskFileItemFactory类
        /**
         * 参数一： 表示文件缓存区的大小。如果上传的文件没有超过缓存区大小，则文件不缓存；否则缓存文件，缓存到临时目录。（byte）
         * 参数二： 表示缓存区的临时目录。
         */
        DiskFileItemFactory factory = new DiskFileItemFactory(10*1024,new File(SystemConfig.getConfig().get("upload_temp_path")));

        //2.创建ServletFileUpload类
        ServletFileUpload upload = new ServletFileUpload(factory);
        //设置单个文件的最大容量
        upload.setFileSizeMax(Integer.parseInt(SystemConfig.getConfig().get("file_size_max"))*1024*1024);

        /**
         * 设置文件名的编码
         */
        upload.setHeaderEncoding("utf-8");
        String msg = "";
        //3.解析request数据（把每一个文件封装到FileItem对象中，FileItem放入List中）
        try {
            List<FileItem> list = upload.parseRequest(req);
            //取出第一个上传的文件
            FileItem file = list.get(0);
            //得到文件大小
            long fileSize = file.getSize();
            if(fileSize == 0){
                throw new FileUploadException("文件内容不能为空，请选择有效的文件重新上传！");
            }

            //得到内容类型
            String contentType = file.getContentType();
            //如果是图片,才可以上传(image/bmp，jepg，jpg，gif)
//            if(!contentType.toLowerCase().matches("image/[a-z]*")){
//                throw new FileUploadException("文件类型不符合条件！");
//            }
            if(!contentType.toLowerCase().equals("application/x-zip-compressed") && !contentType.toLowerCase().equals("application/octet-stream")){
                throw new FileUploadException("文件类型不符合条件，只支持zip或rar文件！");
            }

            //得到文件名(getName())
            String fileName = file.getName();
            //得到源文件的后缀名
//            String supfix = fileName.substring(fileName.lastIndexOf("."));
            //使用UUID算法生成随机名称
//            fileName += UUID.randomUUID().toString()+supfix;
            SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
            fileName = sdf.format(new Date()) + "-" + fileName;

            //得到文件数据内容
            InputStream in = file.getInputStream();
            /**
             * 4.把文件数据内容存储到服务器端的硬盘中
             */
            FileUtils.copyInputStreamToFile(in, new File(SystemConfig.getConfig().get("upload_path")+fileName));
            System.out.println("文件名："+fileName);
            System.out.println("文件大小："+fileSize);
            System.out.println("文件类型："+contentType);
            System.out.println("文件数据内容："+in);

            /**
             * 5.文件上传完毕，手动清理缓存文件
             */
            file.delete();

        } catch (FileUploadBase.FileSizeLimitExceededException e) {
            e.printStackTrace();
            msg = "文件太大," + e;
        } catch (FileUploadException e) {
            e.printStackTrace();
            msg = "文件上传失败," + e;
        }


        if(msg.length() > 0){
            req.setAttribute("msg", msg);
            req.getRequestDispatcher("upload.jsp").forward(req, resp);
        }else{
            //跳回首页
            resp.sendRedirect("/index");
        }

    }

}
